package com.fdb.smcts.core.annotation;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

import com.fdb.smcts.core.validate.DicTypeValidatorImpl;

/**
 * @description:要求定义的field的值必须在指定枚举类中，即field的值必须与method返回的值相同
 * @date:2019年1月17日 下午5:22:21
 * @author:hengyh
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = DicTypeValidatorImpl.class)
public @interface DicType {
	
	Class<?> dicType() ; // 字典枚举类
	String message() default "字典项检查失败";
	String method() default "name"; // 默认方法是name，即枚举量的字面值
	
	Class<?>[] groups() default {};
	Class<? extends Payload>[] payload() default {};
	
	@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
	@Retention(RUNTIME)
	@Documented
	@interface List {
		DicType[] value();
	}
}
